package com.eliza.kotlin.design.creation.single


/*-*- coding:utf-8 -*-
 * @Author  : debi
 * @Time    : 6/4/22
 * @Software: IntelliJ IDEA
 */


/**
 * 	该方式在成员位置声明Singleton类型的静态变量，而对象的创建是在静态代码块中，也是对着类的加载而创建。
 * 	所以和饿汉式的方式1基本上一样，当然该方式也存在内存浪费问题。*/
/*
*  *  饿汉式   在静态代码块中创建该类对象
*/
private class HungrySingleton2 {

    //1，私有构造方法
    private constructor()


    companion object {

        //2，在本类中创建本类对象
        private var instance: HungrySingleton2? = null

        /*init方法最终被编译成了static代码块*/
        init {
            instance = HungrySingleton2()
        }


        //对外提供访问方式
        @Synchronized
        fun getInstance(): HungrySingleton2 {
            //判断instance是否为null，如果为null，说明还没有创建Singleton类的对象
            //如果没有，创建一个并返回，如果有，直接返回
            if (instance == null) {
                //线程1等待，线程2获取到cpu的执行权，也会进入到该判断里面
                instance = HungrySingleton2()
            }

            return instance!!
        }
    }


}

fun main() {

    //创建Singletion类的对象
    val instance = HungrySingleton2.getInstance()

    val instance1 = HungrySingleton2.getInstance()
    //判断获取到的两个是否是同一个对象
    println(instance === instance1)
}